﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanserClient;

namespace TankController.Dominio
{
    public class Cascata : IPlanta, IEntrada
    {
        protected IQuanserClient servidor;
        protected int portaLeitura;
        protected double fatorConversao;
        protected double ganhoPotencial;
        private double valorAmplitude;

        public Cascata()
        {
            if (Global.TipoConfiguracao != TipoConfiguracao.ConfiguracaoC)
            {
                throw new ApplicationException("A operação em cascata não é válida para esta configuração.");
            }
        }

        public Cascata(IQuanserClient servidor, int portaLeitura, double valorAmplitude, double fatorConversao, double ganhoPotencial)
            : this()
        {
            this.servidor = servidor;
            this.portaLeitura = portaLeitura;
            this.valorAmplitude = valorAmplitude;
            this.fatorConversao = fatorConversao;
            this.ganhoPotencial = ganhoPotencial;
        }

        public double Ler()
        {
            return servidor.Read(portaLeitura);
        }

        public double LerSensorSecundario()
        {
            throw new ApplicationException("Não há outro sensor nesta configuração.");
        }

        public void Escrever(double valor)
        {
            this.ValorAmplitude = valor;
        }

        public double GetValorAmplitude(int unidadeTempo)
        {
            return unidadeTempo >= 0 ? valorAmplitude : 0;
        }

        public void GerarPontoSinal(int unidadeTempo, double valorAmplitude, ISinal sinal)
        {
            sinal.AdicionarPonto(unidadeTempo, valorAmplitude);
        }

        public IQuanserClient Servidor
        {
            get { return servidor; }
            set { servidor = value; }
        }
        public int PortaLeitura
        {
            get { return portaLeitura; }
            set { portaLeitura = value; }
        }
        public double FatorConversao
        {
            get { return fatorConversao; }
            set { fatorConversao = value; }
        }
        public double GanhoPotencial
        {
            get { return ganhoPotencial; }
            set { ganhoPotencial = value; }
        }
        public double LimiteTensaoPlantaHigh
        {
            get { throw new ApplicationException("Esta propriedade não é válida para a operação em cascata."); }
            set { throw new ApplicationException("Esta propriedade não é válida para a operação em cascata."); }
        }
        public double LimiteTensaoPlantaLow
        {
            get { throw new ApplicationException("Esta propriedade não é válida para a operação em cascata."); }
            set { throw new ApplicationException("Esta propriedade não é válida para a operação em cascata."); }
        }
        public double LimiteAlturaPlantaHigh
        {
            get { throw new ApplicationException("Esta propriedade não é válida para a operação em cascata."); }
            set { throw new ApplicationException("Esta propriedade não é válida para a operação em cascata."); }
        }
        public double LimiteAlturaPlantaLow
        {
            get { throw new ApplicationException("Esta propriedade não é válida para a operação em cascata."); }
            set { throw new ApplicationException("Esta propriedade não é válida para a operação em cascata."); }
        }
        public double ValorAmplitude
        {
            get
            {
                lock (Global.MonitorCascata) { return valorAmplitude; }
            }
            set
            {
                lock (Global.MonitorCascata) { valorAmplitude = value; }
            }
        }
    }
}
